#include <stdio.h>
#include "../include/history.h"
#include "../include/editline.h"
#include <string.h>
#include <stdlib.h>
#define MAXBUFF 150	/* taille max d'une ligne */
#define MAXHIST 5


typedef struct DList_Cell
{
  char *val;
  struct DList_Cell *prev;
  struct DList_Cell *next;
} DList_Cell;

// phead : premier  de la liste, dernier élément tapé


DList_Cell *phead = NULL;
int histsize;

//on fixe la taille de la liste 
// au début la liste est vide
void init_history(int taille)
{
  histsize = taille;
  phead=NULL;
}

//ajout d'une ligne dans history
void add_history(const char *v)
{
  
  DList_Cell *pnew ;
  pnew= (DList_Cell *)malloc(sizeof(DList_Cell));
  char *v1=malloc(sizeof(char)*200);
  
  strcpy(v1, v);// pour passer de const char * à char *
  pnew->val = v1;
  
  pnew->prev=phead;
  pnew->next=NULL;
  if(phead!=NULL){
    phead->next=pnew;
  }
  // pnew devient phead
  phead=pnew;

  // pour garder un nombre fixe d'éléments dans la liste
  DList_Cell *ptest ;
  int nb = 0;
  for(ptest = phead; ptest->prev; ptest = ptest->prev)
    nb++;
  if(nb >= MAXHIST) {
    ptest = ptest->next;
    free(ptest->prev);        
    ptest->prev = NULL;
  }
    
}
  
// avance dans l'history
char *next_history(void)
{
  
  if(phead == NULL){
   return NULL;
  }
 char* retour = (char*) malloc(sizeof(char)*strlen(phead->val));
 
 strcpy(retour, phead->val);
 
 phead = phead->next;
 
 return retour;
}


//recule dans l'history
char *previous_history(void)
{
  
  if(phead == NULL){
    return NULL;
  }
 char* retour = (char*) malloc(sizeof(char)*strlen(phead->val));
 
 strcpy(retour, phead->val);
 phead = phead->prev;
 
 return retour;
}

void print_history(FILE *f){
  DList_Cell *pcourant;
  // pour accéder au dernier élément. A la fin de la boucle pcourant est le premier tapé (le dernier de la liste)
  for(pcourant = phead; pcourant->prev != NULL; pcourant = pcourant->prev){}
  //On reparcoure la liste dans l'autre sens
  for(;pcourant!=NULL;pcourant=pcourant->next){
    
    fprintf(f, "%s\n ", pcourant->val);
  }
}
